from aip import AipFace
from picamera import PiCamera
import RPi.GPIO as GPIO
import base64
import os
import time
import json
import sg90 # sg90舵机控制门

# 百度人脸识别API账号信息
APP_ID = '24444511'
API_KEY = 'vR2x73TDVveniQc1EmjkaAbn'
SECRET_KEY = 'nrRr25zE3VNMdB6lEATSLkihVSa1GQPc'
client = AipFace(APP_ID, API_KEY, SECRET_KEY)  # 创建一个客户端用以访问百度云
# camera = PiCamera()  # 定义一个摄像头对象
# 用户组
GROUP = 'wisdom_dorm'

# 图像保存的位置
savePath = './image/'

# 图像编码方式
imageType = 'BASE64'


# 创建文件夹 用于存储人脸照片
def createPath():
    # 如果路径不存在 则创建相应文件夹
    if os.path.exists(savePath) == False:
        os.makedirs(savePath + 'rightFace')
        os.makedirs(savePath + 'otherFace')


# 照相函数
def getImage(fileName='faceimage.jpg'):
    camera = PiCamera()  # 定义一个摄像头对象
    filePath = savePath + fileName
    camera.resolution = (1280, 1024)  #摄像界面为1280*1024
    camera.start_preview()  #开始摄像
    time.sleep(2)
    camera.capture(filePath)  #拍照并保存
    time.sleep(2)
    camera.stop_preview()
    camera.close()


# 将图片编码成BASE64
def imageEncode(fileName='faceimage.jpg'):
    f = open(savePath + fileName, 'rb')
    img = base64.b64encode(f.read()) #编码
    return img


# 写入日志文件
def writeLog(date, fileName='faceimage.jpg'):
    #将照片另存到 image/otherFace/ 下
    os.rename(savePath + fileName,
              savePath + 'otherFace/' + 'otherFace' + date + '.jpg')
    
    #保存记录
    f = open('wisdom_dorm.log', 'a')
    f.write(date + '----有人来过，照片已保存到：' + savePath + 'otherFace/' + '\n')
    f.close()


# 人脸识别
# 查看百度的人脸识别SDK开发文档进行开发
def faceDisc(image):
    result = client.search(str(image, 'utf-8'), imageType, GROUP)
    # 如果检查到人脸
    if result['error_msg'] == 'SUCCESS':
        # 获取用户id和识别分数
        name = result['result']['user_list'][0]['user_id']
        score = result['result']['user_list'][0]['score']
        print("score:" + str(score))
        # 识别分数值达到90分以上 则认为是人脸库中的人脸
        if score >= 90:
            if name == 'DaXiongRen':
                print("欢迎" + name + "回家")
            if name == 'jimu':
                print("欢迎" + name + "回家")
            if name == 'TongTong':
                print("欢迎" + name + "回家")
            if name == 'yanyan':
                print("欢迎" + name + "回家")
            return name
        else:
            print("未识别成功，请正面对准摄像头！")
        #以json格式打印 方便查看返回的数据
        #print(json.dumps(result, sort_keys=True, indent=2))
    else:
        print("未检测到人脸！")
    return None


if __name__ == '__main__':
    createPath()
    while True:
        date = time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime())
        fileName = 'tempImage.jpg'
        #调用摄像头拍照
        getImage(fileName)
        #编码图片
        img = imageEncode(fileName)
        #人脸识别
        res = faceDisc(img)
        if res != None:
            # 将照片另存到 image/rightFace/ 下
            os.rename(savePath + fileName,
                      savePath + 'rightFace/' + res + date + '.jpg')
            # print("开门！")
            sg90.openDoor()
        else:
            writeLog(date, fileName)
            # print("关门！")
            sg90.closeDoor()
        print("请对准摄像头 准备...")
        time.sleep(1)
